bitkeeper revision 1.1389.15.5 (4280e522q2MiQniUbfWd_2b5yEMlkA)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 10 May 2005 16:45:22 +0000 (16:45 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 10 May 2005 16:45:22 +0000 (16:45 +0000)
Fix acknowledgement of level-triggered IOAPIC interrupts. This is a
second checkin, after disentangling from aborted and utterly broken
PCI-MSI changes.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/io_apic.c
xen/include/asm-x86/io_apic.h

index 3e7c89cf0e1745829cdaa30332fad99b8e4efc48..bb69348b14cea6faf3286654d29d07233cbb386c 100644 (file)
@@ -145,16 +145,16 @@ static void __unmask_IO_APIC_irq (unsigned int irq)
        __modify_IO_APIC_irq(irq, 0, 0x00010000);
 }
 
-/* mask = 1, trigger = 0 */
-static void __mask_and_edge_IO_APIC_irq (unsigned int irq)
+/* trigger = 0 */
+static void __edge_IO_APIC_irq (unsigned int irq)
 {
-       __modify_IO_APIC_irq(irq, 0x00010000, 0x00008000);
+       __modify_IO_APIC_irq(irq, 0, 0x00008000);
 }
 
-/* mask = 0, trigger = 1 */
-static void __unmask_and_level_IO_APIC_irq (unsigned int irq)
+/* trigger = 1 */
+static void __level_IO_APIC_irq (unsigned int irq)
 {
-       __modify_IO_APIC_irq(irq, 0x00008000, 0x00010000);
+       __modify_IO_APIC_irq(irq, 0x00008000, 0);
 }
 
 static void mask_IO_APIC_irq (unsigned int irq)
@@ -1637,12 +1637,14 @@ static unsigned int startup_level_ioapic_irq (unsigned int irq)
        return 0; /* don't check for pending */
 }
 
-static void end_level_ioapic_irq (unsigned int irq)
+static void mask_and_ack_level_ioapic_irq (unsigned int irq)
 {
        unsigned long v;
        int i;
 
        move_irq(irq);
+
+       mask_IO_APIC_irq(irq);
 /*
  * It appears there is an erratum which affects at least version 0x11
  * of I/O APIC (that's the 82093AA and cores integrated into various
@@ -1671,12 +1673,17 @@ static void end_level_ioapic_irq (unsigned int irq)
        if (!(v & (1 << (i & 0x1f)))) {
                atomic_inc(&irq_mis_count);
                spin_lock(&ioapic_lock);
-               __mask_and_edge_IO_APIC_irq(irq);
-               __unmask_and_level_IO_APIC_irq(irq);
+               __edge_IO_APIC_irq(irq);
+               __level_IO_APIC_irq(irq);
                spin_unlock(&ioapic_lock);
        }
 }
 
+static void end_level_ioapic_irq (unsigned int irq)
+{
+       unmask_IO_APIC_irq(irq);
+}
+
 #ifdef CONFIG_PCI_MSI
 static unsigned int startup_edge_ioapic_vector(unsigned int vector)
 {
@@ -1699,6 +1706,13 @@ static unsigned int startup_level_ioapic_vector (unsigned int vector)
        return startup_level_ioapic_irq (irq);
 }
 
+static void mask_and_ack_level_ioapic_vector (unsigned int vector)
+{
+       int irq = vector_to_irq(vector);
+
+       mask_and_ack_level_ioapic_irq(irq);
+}
+
 static void end_level_ioapic_vector (unsigned int vector)
 {
        int irq = vector_to_irq(vector);
index 5c71c08f58fcf8e37380261f16a8f637b60a3952..5e9448a84770f931c86d955731564b2742ee6bce 100644 (file)
@@ -17,7 +17,6 @@
 #ifdef CONFIG_PCI_MSI
 static inline int use_pci_vector(void) {return 1;}
 static inline void disable_edge_ioapic_vector(unsigned int vector) { }
-static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { }
 static inline void end_edge_ioapic_vector (unsigned int vector) { }
 #define startup_level_ioapic   startup_level_ioapic_vector
 #define shutdown_level_ioapic  mask_IO_APIC_vector
@@ -36,7 +35,6 @@ static inline void end_edge_ioapic_vector (unsigned int vector) { }
 #else
 static inline int use_pci_vector(void) {return 0;}
 static inline void disable_edge_ioapic_irq(unsigned int irq) { }
-static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { }
 static inline void end_edge_ioapic_irq (unsigned int irq) { }
 #define startup_level_ioapic   startup_level_ioapic_irq
 #define shutdown_level_ioapic  mask_IO_APIC_irq